package com.jhy.new2025.string;

/**
 * 翻转字符串
 */
public class ReverseString {

    /**
     * 这道题使用双指针的方法
     *
     * @param s
     */
    public void reverseString(char[] s) {
        /**
         * 要求空间复杂度为 1 故要使用常量级别的
         *
         */
        for (int i = 0; i < s.length / 2; i++) {
            char temp = s[i];
            s[i] = s[s.length - i - 1];
            s[s.length - i - 1] = temp;
        }
    }

    /**
     * 给定一个字符串 s 和一个整数 k，
     * 1、从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
     * 2、如果剩余字符少于 k 个，则将剩余字符全部反转。
     * 3、如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
     *
     * @param s
     * @param k
     * @return 输入：s = "abcd ef g", k = 2
     * 输出："bacdfeg"
     */
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i += 2 * k) {
            // 因为第一点和第三点的都是反转前k个字符 所以就先不用管
            if (chars.length - i - 1 < k) {
                res2(chars, i, chars.length - 1);
                continue;
            }
            res2(chars, i, i + k - 1);
        }

        return new String(chars);
    }
    // 定义一个方法 从不同的坐标开始反转

    private void res2(char[] c, int start, int end) {
        while (start < end) {
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;
        }
    }


}

